import os
from PIL import Image

class ImageFormatConverter:
    """
    图像格式转换类：用于将指定文件夹中的所有图片转换为指定格式。
    """

    def __init__(self, input_dir: str, fmt: str = "jpg", output_dir: str = r"C:\Users\33720\Desktop\temp\img"):

        self.input_dir = input_dir
        self.fmt = fmt.lower().replace(".", "")  # 确保格式统一（去掉点号）
        self.output_dir = output_dir
        self.format_map = {
            "jpg": "JPEG",
            "jpeg": "JPEG",
            "png": "PNG",
            "bmp": "BMP",
            "gif": "GIF",
            "webp": "WEBP",
            "tiff": "TIFF"
        }
    # ✅ setter函数：设置输入目录
    def set_input_dir(self, input_dir):
        if not os.path.isdir(input_dir):
            raise ValueError(f"输入目录不存在: {input_dir}")
        self.input_dir = input_dir

    # ✅ setter函数：设置输出格式
    def set_fmt(self, fmt):
        fmt = fmt.lower().replace(".", "")
        valid_formats = ["jpg", "jpeg", "png", "bmp", "gif", "webp", "tiff"]
        if fmt not in valid_formats:
            raise ValueError(f"不支持的图片格式: {fmt}")
        self.fmt = fmt

    # ✅ setter函数：设置输出目录
    def set_output_dir(self, output_dir):
        os.makedirs(output_dir, exist_ok=True)
        self.output_dir = output_dir

    def convert_images(self):
        """
        将输入文件夹中的所有图片转换为目标格式并保存到输出文件夹
        """
        # 检查输入目录
        if not os.path.isdir(self.input_dir):
            raise FileNotFoundError(f"输入文件夹不存在: {self.input_dir}")

        # 创建输出目录（如不存在）
        os.makedirs(self.output_dir, exist_ok=True)

        # 支持的图片扩展名
        valid_exts = (".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".webp", ".gif")

        # 获取正确的格式标识符
        pil_format = self.format_map.get(self.fmt)
        if not pil_format:
            raise ValueError(f"不支持的输出格式: {self.fmt}")

        # 遍历输入文件夹
        for filename in os.listdir(self.input_dir):
            file_path = os.path.join(self.input_dir, filename)
            file_name, ext = os.path.splitext(filename)

            # 只处理图片文件
            if ext.lower() in valid_exts:
                try:
                    # 打开图片并转换为 RGB（避免模式问题）
                    with Image.open(file_path) as img:
                        if img.mode != "RGB":
                            img = img.convert("RGB")

                        output_path = os.path.join(self.output_dir, f"{file_name}.{self.fmt}")

                        # 特殊处理 JPEG 格式的质量
                        if self.fmt in ["jpg", "jpeg"]:
                            img.save(output_path, pil_format, quality=95)
                        else:
                            img.save(output_path, pil_format)

                    print(f"✅ 已转换: {output_path}:{filename} → {file_name}.{self.fmt}")

                except Exception as e:
                    print(f"❌ 转换失败: {output_path}，错误: {e}")
        return self.output_dir
